import http from "@/api";
import { ReqPage, ResPage } from "@/api/interface";
import { UploadFile } from "element-plus/es/components/upload/src/upload";

const baseUrl: string = "/file";

export interface FileDetailPageParam extends ReqPage {
  // 原始文件名
  originalFilename?: string;
}

export interface FileDetailPageResult {
  // 主键id
  id: string;
  // 文件访问地址
  url: string;
  // 文件大小，单位字节
  size: string;
  // 原始文件名
  originalFilename: string;
  // 文件扩展名
  ext: string;
  // 存储平台
  platform: string;
  // 缩略图访问路径
  thUrl: string;
  // 缩略图名称
  thFilename: string;
  // 创建时间
  createTime: string;
  // 上传状态，仅在手动分片上传时使用，1：初始化完成，2：上传完成 参照字典: UploadStatus
  uploadStatus: number;
}

export const getFileDetailPage = (param: FileDetailPageParam) => {
  return http.get<ResPage<FileDetailPageResult>>(baseUrl + `/page`, param);
};

export interface PlatformInfoResult {
  // 平台标识
  platform: string;
}

export const getPlatformInfo = () => {
  return http.get<PlatformInfoResult>(baseUrl + `/platformInfo`);
};

export interface UploadFileParam {
  // 平台
  platform: string;
  fileList: UploadFile[];
}

export const uploadFile = (param: FormData) => {
  return http.post<FileDetailInfoResult[]>(baseUrl + `/upload`, param);
};

export const downloadFile = (id: string) => {
  return http.get(baseUrl + `/download/` + id, {}, { responseType: "blob" });
};

export interface FileDetailInfoResult {
  // 主键id
  id: string;
  // 文件访问地址
  url: string;
  // 文件大小，单位字节
  size: string;
  // 原始文件名
  originalFilename: string;
  // 文件扩展名
  ext: string;
  // 存储平台
  platform: string;
}

export const getFileDetailInfo = (id: string) => {
  return http.get<FileDetailInfoResult>(baseUrl + `/info/` + id);
};

export const deleteFileDetail = (ids: string[]) => {
  return http.post(baseUrl + `/delete`, ids);
};

export const exportFileDetailExcel = (param: FileDetailPageParam) => {
  return http.get<any>(baseUrl + `/export/excel`, param, { loading: true, responseType: "blob" });
};

// 每个分片大小为5M(由实际业务而定) todo 请求后端获取分片大小
export const CHUNK_SIZE = 5 * 1024 * 1024;

// 分片上传并发数
export const CONCURRENCY = 5;

/**
 * 初始化分片上传参数
 */
export interface InitChunkUploadParam {
  /**
   * 存储平台
   */
  platform: string;
  /**
   * 文件原始名称
   */
  originalName: string;
  /**
   * 文件大小(单位字节) 用来判断文件是否上传完毕!
   */
  size: number;
}

export const chunkInit = (param: InitChunkUploadParam) => {
  return http.post<FileDetailInfoResult>(baseUrl + `/chunk/init`, param);
};

export interface FilePartInfo {
  /**
   * 分片ID，仅在数据库相关操作时使用
   */
  id?: string;

  /**
   * 存储平台
   */
  platform: string;

  /**
   * 上传ID
   */
  uploadId: string;

  /**
   * 分片 ETag（分片数据的MD5值）
   */
  eTag: string;

  /**
   * 分片号。每一个上传的分片都有一个分片号，一般情况下取值范围是1~10000
   */
  partNumber: number;

  /**
   * 分片大小，单位字节
   */
  partSize: number;

  /**
   * 哈希信息类，用来存储各种哈希值
   */
  hashInfo: Record<string, string>;

  /**
   * 创建时间，仅在保存到数据库时使用
   */
  createTime?: Date;

  /**
   * 分片最后修改时间，仅在获取分片信息时使用
   */
  lastModified?: Date;
}

export const chunkUploadFile = (param: FormData) => {
  return http.post<FilePartInfo>(baseUrl + `/chunk/upload`, param, { cancel: false, loading: false });
};
